package info.demo.persistence.hibernate;

import info.demo.entity.Conta;
import info.demo.entity.ContaPesquisa;
import info.demo.entity.Page;
import info.demo.persistence.ContaDAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.ScrollableResults;

public class ContaDAOImpl extends AbstractHibernateDAO<Conta, Integer> implements ContaDAO {

	@Override
	public List<Conta> recuperaContas(ContaPesquisa contaPesquisa, Page p) {
		List<Conta> contas = null;
		try {
			String hql = "from Conta " + contaPesquisa.getHQL();
			int i=0;
			if (p.getOrdemColunas() != null && p.getOrdemColunas().length>0) {
				hql+=" ORDER BY ";
			}
			for(String colunaOrdem : p.getOrdemColunas()) {
				hql+=" " + colunaOrdem + " " + p.getOrdemRegras()[i];
				i++;
				if (i < p.getOrdemColunas().length) {
					hql+=",";
				}
			}
			Query q = getSession().createQuery(hql);
			contaPesquisa.configuraQuery(q);
            ScrollableResults sr = q.scroll();
            sr.last();
            p.setTotalRegistros(sr.getRowNumber() + 1); // RowNumber inicia em zero
			q.setFirstResult(p.getNumeroPrimeiroResultado());
			q.setMaxResults(p.getPaginaTamanho());
			contas = q.list();
		}catch(Exception e) {
			e.printStackTrace();
		}
		return contas;
	}

	@Override
	public List<String> recuperaGruposContas() {
		List<String> contas = null;
		try {
			Query q = getSession().createQuery("select distinct (c.grupoConta) from Conta c order by c.grupoConta ASC ");
			List<String> l = q.list();
			List<String> nl = new ArrayList<String>();
			for(String a : l) {
				nl.add(a.trim());
			}
			contas = nl;
		}catch(Exception e) {
			e.printStackTrace();
		}
		return contas;
	}
	
}
